#ifndef __PLAY_WAV_H__
#define __PLAY_WAV_H__

#include <stdio.h>
#include <stdlib.h>
#include <alsa/asoundlib.h>

/*
编译命令: gcc wav_tool.c -o AlsaTool -lasound -lstdc++
使用方法:
  录音: ./AlsaTool
  播放: ./AlsaTool 文件名.wav
*/

// 固定宽度类型定义
typedef uint16_t  WORD;
typedef uint32_t  DWORD;
typedef int8_t    CHAR;

// 结构体定义（按字节对齐）
typedef struct 
{
    WORD    wFormatTag;         // 编码格式（1=PCM）
    WORD    nChannels;          // 声道数
    DWORD   nSamplesPerSec;     // 采样率
    DWORD   nAvgBytesPerSec;    // 平均字节率
    WORD    nBlockAlign;        // 块对齐
} __attribute__((packed)) WAVEFORMAT;

typedef struct 
{
    WAVEFORMAT wf;
    WORD       wBitsPerSample;  // 采样位数
} __attribute__((packed)) PCMWAVEFORMAT;

typedef struct 
{
    CHAR    SubchunkID[4];      // 块标识（"fact"）
    DWORD   SubchunkSize;       // 块大小
    DWORD   dwSampleLength;     // 采样帧数
} __attribute__((packed)) FACT_CHUNK;

typedef struct 
{
    CHAR    ChunkID[4];         // 标识（"RIFF"）
    DWORD   ChunkSize;          // 总大小（不含自身ID和大小）
    CHAR    Format[4];          // 格式（"WAVE"）
} __attribute__((packed)) RIFF_CHUNK;

typedef struct 
{
    CHAR    SubchunkID[4];      // 标识（"data"）
    DWORD   SubchunkSize;       // 数据大小
} __attribute__((packed)) DATA_CHUNK;

// 完整WAV头结构体（RIFF + fmt块 + data块）
typedef struct 
{
    RIFF_CHUNK    riff;           // RIFF块（12字节）
    char          fmt_id[4];      // fmt块ID（"fmt "，4字节）
    DWORD         fmt_size;       // fmt块大小（4字节）
    PCMWAVEFORMAT fmt;            // fmt块内容（24字节）
    DATA_CHUNK    data;           // data块（8字节）
} __attribute__((packed)) WAV_HEADER;  // 总大小：12+4+4+24+8=52字节


int ParseWav(const char* filename, unsigned int* sample_rate, unsigned short* channels, unsigned short* bits_per_sample);


// 函数声明
int PlayWavFile(const char *cstrFileName);
int RecordAudio(const char *filename, int duration);
bool IsAudioFile(const std::string &strFileName);
void ShowHelpInfo();
static int set_hw_params(snd_pcm_t *pcmHandler, unsigned int sample_rate, unsigned short channels, unsigned short bits_per_sample);
void write_wav_header(int fd, unsigned int sample_rate, unsigned short channels, unsigned short bits_per_sample, int duration);


#endif